iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Software Development

Zero to Ruby on Rails系列 第 5

Day 05 - Hash and Symbol 雜湊和符號

  • 分享至 

  • xImage
  •  

Hash 雜湊

Hash 是資料的集合,由 KeyValue 組成,像字典的概念,使用關鍵字( Key )會查到相對應的資料 ( Value )

Hash 兩種寫法

hash_old_way = { :name => 'Luffy', :age => 19 }    # 舊式寫法
hash_new_way = { name: 'Luffy', age: 19 }          # 新式寫法(Ruby 1.9版後)

p hash_old_way

#印出 {:name=>"Luffy", :age=>19}

p hash_new_way

#印出 {:name=>"Luffy", :age=>19}

雖然有分新舊寫法,其實新式寫法只是語法糖衣,本質並沒有改變。

要拿對的鑰匙才能拿到對的資料


reward_list = {name: "魯夫", age: 19, bounty: "30億貝里" }

# 拿到名字
puts reward_list[:name]      # 印出 魯夫

# 拿到所有的keys
p reward_list.keys           # 印出 [:name, :age, :bounty]

#拿到所有的values
p reward_list.values         # 印出 ["魯夫", 19, "30億貝里"]

Symbol 符號

在rails 專案可能會出現以下範例,這裡的 :profile :posts 就是表示符號。


class User < ApplicationRecord
  has_one :profile
  has_many :posts
  
end

符號就是帶有名字物件也可以說是一個值,同時符號也有著不可變的特性。


p :hi    # 印出 :hi
p 666    # 印出 666

:name = "Luffy" # 會報錯,因為符號是一個值

字串跟符號的差別

字串的內容是可以修改的,但是符號不能!


fruit = "橡膠果實"
fruit.gsub!("橡膠果實", "人人果實")    #使用gsub方法重新賦值

puts fruit       # 印出 人人果實

符號的效能會比字串好一點,同個程式裡每次字串印出來的object_id都會不同,而符號則是相同的object_id


# 在同一個程式裡

p "hi".object_id    # 印出 740
p "hi".object_id    # 印出 760
p "hi".object_id    # 印出 780

p :hi.object_id     # 印出 1877148
p :hi.object_id     # 印出 1877148
p :hi.object_id     # 印出 1877148

小知識:在 Ruby 中,數字的 object_id 都是用 2n+1 的方法,所以怎麼印都會是相同的 object_id


p 1.object_id     # 印出 3
p 1.object_id     # 印出 3
p 1.object_id     # 印出 3
p 2.object_id     # 印出 5
p 2.object_id     # 印出 5
p 2.object_id     # 印出 5
p 10.object_id    # 印出 21
p 10.object_id    # 印出 21
p 10.object_id    # 印出 21

字串跟符號的相互轉換:

字串轉符號可以使用 to_sym 或是 intern 方法
符號轉字串可以使用 to_s 或是 id2name 方法

字串跟符號的使用時機:

不可改變-選符號
可以改變-選字串

預告

Day 06 預計來介紹邏輯判斷與流程控制,我們明天見!


上一篇
Day 04 - String, Number, Array and Range 字串、數字、陣列&範圍
下一篇
Day 06 - Logical Evaluation and Flow Controller邏輯判斷和流程控制
系列文
Zero to Ruby on Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言